home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics Plus
/
Graphics Plus.iso
/
msdos
/
fractal
/
frasr182
/
prompts2.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-18
|
51KB
|
1,795 lines
/*
Various routines that prompt for things.
This module is linked as an overlay, use ENTER_OVLY and EXIT_OVLY.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#ifndef XFRACT
#include <dos.h>
#elif !defined(__386BSD__)
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/dir.h>
#endif
#ifdef __TURBOC__
#include <alloc.h>
#elif !defined(__386BSD__)
#include <malloc.h>
#endif
#ifdef __hpux
#include <sys/param.h>
#define getwd(a) getcwd(a,MAXPATHLEN)
#endif
#include "fractint.h"
#include "fractype.h"
#include "helpdefs.h"
#include "prototyp.h"
/* Routines defined in prompts1.c */
extern int prompt_checkkey(int curkey);
extern long get_file_entry(int,char *,char *,char *,char *);
/* Routines used in prompts1.c */
int get_corners(void);
int edit_ifs_params(void );
int lccompare(VOIDCONSTPTR, VOIDCONSTPTR); /* Needed in prompts1.c PAV */
/* Routines in this module */
static int findfirst(char *path);
static int check_f6_key(int curkey,int choice);
static int findnext(void );
int splitpath(char *template,char *drive,char *dir,char *fname,char *ext);
int makepath(char *template,char *drive,char *dir,char *fname,char *ext);
static void fix_dirname(char *dirname);
static int expand_dirname(char *dirname,char *drive);
static int filename_speedstr(int, int, int, char *, int);
static int isadirectory(char *s);
static int check_f6_key(int curkey,int choice);
extern int dotmode;
extern int orbit_delay;
extern char diskfilename[];
extern char *fract_dir1, *fract_dir2;
#ifndef XFRACT
extern int strncasecmp(char *s,char *t,int ct);
#endif
extern char temp1[256]; /* temporary strings */
extern double xxmin,xxmax; /* initial corner values */
extern double yymin,yymax; /* initial corner values */
extern BYTE usemag;
extern int AntiAliasing;
extern double zzmin, zzmax, ttmin, ttmax;
extern int Transparent3D;
extern double xx3rd,yy3rd; /* initial corner values */
extern int invert; /* non-zero if inversion active */
extern double inversion[3]; /* radius, xcenter, ycenter */
extern int pot16bit;
extern int disk16bit;
extern double potparam[3]; /* three potential parameters*/
extern int fractype; /* if == 0, use Mandelbrot */
extern char usr_floatflag; /* floating-point fractals? */
extern int maxit; /* try this many iterations */
extern int inside; /* inside color */
extern int fillcolor; /* fill color */
extern int outside; /* outside color */
extern int finattract; /* finite attractor switch */
extern char savename[80]; /* save files using this name */
extern int decomp[]; /* decomposition parameters */
extern int usr_distest; /* distance estimator option */
extern int distestwidth;
extern char usr_stdcalcmode; /* '1', '2', 'g', 'b' */
extern char overwrite; /* overwrite= flag */
extern int soundflag; /* sound option */
extern int LogFlag; /* non-zero if logarithmic palettes */
extern int usr_biomorph; /* Biomorph flag */
#if 0
//extern long xmin, xmax, ymin, ymax; /* screen corner values */
#endif
extern int xdots, ydots; /* coordinates of dots on the screen */
extern int colors; /* maximum colors available */
extern int row, col;
extern int viewwindow;
extern float viewreduction;
extern int viewcrop;
extern float finalaspectratio;
extern int viewxdots,viewydots;
extern int textcbase;
extern int textrow,textcol;
extern int resave_flag; /* resaving after a timed save */
extern int started_resaves;
extern char boxy[];
extern int rotate_lo,rotate_hi;
extern int rangeslen;
extern float screenaspect;
extern int cmdarg(char *,int);
extern char CommandFile[];
extern char CommandName[];
extern float far *ifs_defn;
extern int ifs_type;
extern int ifs_changed;
extern int initbatch; /* 1 if batch run (no kbd) */
/* speed key state values */
#define MATCHING 0 /* string matches list - speed key mode */
#define TEMPLATE -2 /* wild cards present - buiding template */
#define SEARCHPATH -3 /* no match - building path search name */
#define FILEATTR 0x37 /* File attributes; select all but volume labels */
#define HIDDEN 2
#define SYSTEM 4
#define SUBDIR 16
#define MAXNUMFILES 300
struct /* Allocate DTA and define structure */
{
char path[21]; /* DOS path and filespec */
char attribute; /* File attributes wanted */
int ftime; /* File creation time */
int fdate; /* File creation date */
long size; /* File size in bytes */
char filename[13]; /* Filename and extension */
} DTA; /* Disk Transfer Area */
#define GETFORMULA 0
#define GETLSYS 1
#define GETIFS 2
#define GETPARM 3
/* --------------------------------------------------------------------- */
extern char s_iter[];
extern char s_real[];
extern char s_mult[];
extern char s_sum[];
extern char s_imag[];
extern char s_zmag[];
extern char s_bof60[];
extern char s_bof61[];
extern char s_maxiter[];
extern char s_epscross[];
extern char s_startrail[];
extern char s_normal[];
extern char s_period[];
char commandmask[13] = {"*.par"};
void prompts2_overlay() { } /* for restore_active_ovly */
#if 0
/* --------------------------------------------------------------------- */
extern int promptfkeys;
int edit_ifs_params() /* prompt for IFS params */
{
int totcols;
int i, j, k, numlines, ret;
FILE *tempfile;
char msg[81];
char filename[81];
float ftemp;
int oldhelpmode;
int low, hi;
if (!ifs_defn && !ifsload())
return(-1);
totcols = (ifs_type == 0) ? IFSPARM : IFS3DPARM;
ret = 0;
oldhelpmode = helpmode;
helpmode = HT_IFS;
low = 0;
for ( ;; ) {
static char far ifshdg2[]={"2D IFS Parameters"};
static char far ifshdg3[]={"3D IFS Parameters"};
static char far ifsparmmsg1[]={"# a b c d e f"};
static char far ifsparmmsg2[]={" g h i j k l"};
static char far ifsprompt[]={"\
Enter the number of the line you want to edit,\n\
S to save, F6 for corners, or ENTER to end ==>"};
int leftcol,promptrow,promptcol;
#define IFS_NUM 12
for (numlines = 0; numlines < NUMIFS; numlines++) /* find the first zero entry */
if (ifs_defn[(numlines * totcols) + totcols - 1] <= 0.0001) break;
helptitle();
setattr(1,0,C_PROMPT_BKGRD,24*80); /* init rest of screen to background */
putstringcenter(2,0,80,C_GENERAL_HI,(ifs_type == 0) ? ifshdg2 : ifshdg3);
leftcol = (ifs_type == 0) ? 15 : 0;
putstring(4,leftcol+1,C_GENERAL_HI,ifsparmmsg1);
if (ifs_type != 0)
putstring(-1,-1,C_GENERAL_HI,ifsparmmsg2);
putstring(-1,-1,C_GENERAL_HI," prob \n\n");
hi = low+IFS_NUM;
if (hi>numlines) hi = numlines;
for (i = low; i < hi; i++) {
sprintf(msg,"%2d", i+1);
putstring(5+i-low,leftcol,C_GENERAL_HI,msg);
for (j = 0; j < totcols; j++) {
sprintf(msg,"%6.2f",ifs_defn[(i*totcols)+j]);
putstring(-1,-1,C_GENERAL_MED,msg);
}
}
if (hi<numlines) {
putstring(5+IFS_NUM,leftcol,C_GENERAL_HI,"(more)");
}
textcbase = 14;
putstring(5+i-low+1,0,C_GENERAL_HI,ifsprompt);
promptrow = textrow;
promptcol = textcol + textcbase + 1;
temp1[0] = textcbase = 0;
promptfkeys = 1<<6;
i = input_field(0,C_GENERAL_INPUT,temp1,2,promptrow,promptcol,
prompt_checkkey);
if (i<0) {
break;
} else if (i==PAGE_UP) {
low -= IFS_NUM;
if (low<0) low=0;
} else if (i==UP_ARROW) {
low -= 1;
if (low<0) low=0;
} else if (i==DOWN_ARROW) {
low += 1;
if (low+IFS_NUM>numlines) low=numlines-IFS_NUM;
if (low<0) low=0;
} else if (i==PAGE_DOWN) {
low += IFS_NUM;
if (low+IFS_NUM>numlines) low=numlines-IFS_NUM;
if (low<0) low=0;
} else if (i==F6) {
if (get_corners()) {
ret = 1;
}
} else if (i==0) {
if (temp1[0]==0) break;
} else {
continue;
}
putstring(promptrow,promptcol,C_GENERAL_HI,temp1);
if (temp1[0] == 's' || temp1[0] == 'S') {
stackscreen();
filename[0] = 0;
i = field_prompt(0,"Enter the name of the .IFS file to save:",
NULL,filename,60,NULL);
unstackscreen();
if (i != -1) {
if (strchr(filename,'.') == NULL)
strcat(filename,".ifs");
if ((tempfile=fopen(filename,"w")) != NULL) {
for (i = 0; i < numlines; i++) {
for (j = 0; j < totcols; j++)
fprintf(tempfile, "%6.2f", (float)ifs_defn[(i*totcols)+j]);
fprintf(tempfile, "\n");
}
fclose(tempfile);
ifs_changed = 0;
}
else {
static char far msg[]={"Could not create file"};
stopmsg(0,msg);
}
}
continue;
}
i = atoi(temp1) - 1;
if (i >= 0 && i < numlines) {
for (j = 0; j < totcols; j++) {
if (j < totcols-1)
sprintf(msg,"Parameter %c",'a'+j);
else
sprintf(msg,"Probability");
putstring(promptrow+2,25,C_GENERAL_HI,msg);
sprintf(temp1,"%6.2f",(float)ifs_defn[k=(i*totcols)+j]);
if (input_field(1,C_GENERAL_INPUT,temp1,6,
textrow,textcol+1,NULL) < 0)
break;
if (ifs_defn[k] != (ftemp = atof(temp1))) {
ifs_defn[k] = ftemp;
ret = ifs_changed = 1;
}
}
memset(msg,' ',80); msg[81] = 0;
putstring(promptrow+2,0,C_PROMPT_BKGRD,msg);
}
}
helpmode = oldhelpmode;
return(ret);
}
#endif
/* --------------------------------------------------------------------- */
/*
get_toggles() is called from FRACTINT.C whenever the 'x' key
is pressed. This routine prompts for several options,
sets the appropriate variables, and returns the following code
to the calling routine:
-1 routine was ESCAPEd - no need to re-generate the image.
0 nothing changed, or minor variable such as "overwrite=".
No need to re-generate the image.
1 major variable changed (such as "inside="). Re-generate
the image.
Finally, remember to insert variables in the list *and* check
for them in the same order!!!
*/
#define LOADCHOICES(X) {\
static char far tmp[] = { X };\
choices[++k]= tmp;\
}
int get_toggles()
{
static char far hdg[]={" Basic Options\n\
(not all combinations make sense)"};
char far *choices[20];
int oldhelpmode;
char prevsavename[81];
struct fullscreenvalues uvalues[25];
int i, j, k;
char old_usr_stdcalcmode;
int old_maxit,old_inside,old_outside,old_soundflag;
int old_logflag,old_biomorph,old_decomp;
int old_fillcolor;
static char *calcmodes[] ={"1","2","g","b","t"};
static char *soundmodes[5]={"yes","no","x","y","z"};
ENTER_OVLY(OVLY_PROMPTS2);
k = -1;
LOADCHOICES("Passes (1, 2, g[uessing], b[oundary trace], t[esseral])");
uvalues[k].type = 'l';
uvalues[k].uval.ch.vlen = 3;
uvalues[k].uval.ch.llen = sizeof(calcmodes)/sizeof(*calcmodes);
uvalues[k].uval.ch.list = calcmodes;
uvalues[k].uval.ch.val = (usr_stdcalcmode == '1') ? 0
: (usr_stdcalcmode == '2') ? 1
: (usr_stdcalcmode == 'g') ? 2
: (usr_stdcalcmode == 'b') ? 3 :4 ;
old_usr_stdcalcmode = usr_stdcalcmode;
LOADCHOICES("Floating Point Algorithm");
uvalues[k].type = 'y';
uvalues[k].uval.ch.val = usr_floatflag;
LOADCHOICES("Maximum Iterations (2 to 32767)");
uvalues[k].type = 'i';
uvalues[k].uval.ival = old_maxit = maxit;
LOADCHOICES("Inside Color (<nnn>,maxiter,zmag,bof60,bof61,epscr,star,per)");
uvalues[k].type = 's';
if(inside == -59)
strcpy(uvalues[k].uval.sval,s_zmag);
else if(inside == -60)
strcpy(uvalues[k].uval.sval,s_bof60);
else if(inside == -61)
strcpy(uvalues[k].uval.sval,s_bof61);
else if(inside == -100)
strcpy(uvalues[k].uval.sval,s_epscross);
else if(inside == -101)
strcpy(uvalues[k].uval.sval,s_startrail);
else if(inside == -102)
strcpy(uvalues[k].uval.sval,s_period);
else if(inside == -1)
strcpy(uvalues[k].uval.sval,s_maxiter);
else
sprintf(uvalues[k].uval.sval,"%d",inside);
old_inside = inside;
LOADCHOICES("Outside Color (<nnn>,iter,real,imag,mult,summ)");
uvalues[k].type = 's';
if(outside == -1)
strcpy(uvalues[k].uval.sval,s_iter);
else if(outside == -2)
strcpy(uvalues[k].uval.sval,s_real);
else if(outside == -3)
strcpy(uvalues[k].uval.sval,s_imag);
else if(outside == -4)
strcpy(uvalues[k].uval.sval,s_mult);
else if(outside == -5)
strcpy(uvalues[k].uval.sval,s_sum);
else
sprintf(uvalues[k].uval.sval,"%d",outside);
old_outside = outside;
LOADCHOICES("Savename (.GIF implied)");
uvalues[k].type = 's';
strcpy(prevsavename,savename);
strcpy(uvalues[k].uval.sval,savename);
LOADCHOICES("File Overwrite ('overwrite=')");
uvalues[k].type = 'y';
uvalues[k].uval.ch.val = overwrite;
LOADCHOICES("Sound (no, yes, x, y, z)");
uvalues[k].type = 'l';
uvalues[k].uval.ch.vlen = 3;
uvalues[k].uval.ch.llen = 5;
uvalues[k].uval.ch.list = soundmodes;
uvalues[k].uval.ch.val = 1 + (old_soundflag = soundflag);
if (rangeslen == 0) {
LOADCHOICES("Log Palette (0=no,1=yes,-1=old,+n=cmprsd,-n=sqrt)");
uvalues[k].type = 'i';
}
else {
LOADCHOICES("Log Palette (n/a, ranges= parameter is in effect)");
uvalues[k].type = '*';
}
uvalues[k].uval.ival = old_logflag = LogFlag;
LOADCHOICES("Biomorph Color (-1 means OFF)");
uvalues[k].type = 'i';
uvalues[k].uval.ival = old_biomorph = usr_biomorph;
LOADCHOICES("Decomp Option (2,4,8,..,256, 0=OFF)");
uvalues[k].type = 'i';
uvalues[k].uval.ival = old_decomp = decomp[0];
LOADCHOICES("Fill Color (normal,<nnn>) (works with passes=t and =b)");
uvalues[k].type = 's';
if(fillcolor < 0)
strcpy(uvalues[k].uval.sval,s_normal);
else
sprintf(uvalues[k].uval.sval,"%d",fillcolor);
old_fillcolor = fillcolor;
LOADCHOICES("Orbit delay (0 = none)");
uvalues[k].type = 'i';
uvalues[k].uval.ival = orbit_delay;
/*
LOADCHOICES("Antialiasing (0 to 8)");
uvalues[k].type = 'i';
uvalues[k].uval.ival = AntiAliasing;
*/
oldhelpmode = helpmode;
helpmode = HELPXOPTS;
i = fullscreen_prompt(hdg,k+1,choices,uvalues,0,0,NULL);
helpmode = oldhelpmode;
if (i < 0) {
EXIT_OVLY;
return(-1);
}
/* now check out the results (*hopefully* in the same order <grin>) */
k = -1;
j = 0; /* return code */
usr_stdcalcmode = calcmodes[uvalues[++k].uval.ch.val][0];
if (old_usr_stdcalcmode != usr_stdcalcmode) j = 1;
if (uvalues[++k].uval.ch.val != usr_floatflag) {
usr_floatflag = uvalues[k].uval.ch.val;
j = 1;
}
++k;
maxit = uvalues[k].uval.ival;
if (maxit < 2) maxit = 2;
/* 'maxit' is an int so it is always <= 32767, MCP 12-3-91
if (maxit > 32767) maxit = 32767;
*/
if (maxit != old_maxit) j = 1;
if(strncmp(strlwr(uvalues[++k].uval.sval),s_zmag,4)==0)
inside = -59;
else if(strncmp(strlwr(uvalues[k].uval.sval),s_bof60,5)==0)
inside = -60;
else if(strncmp(strlwr(uvalues[k].uval.sval),s_bof61,5)==0)
inside = -61;
else if(strncmp(strlwr(uvalues[k].uval.sval),s_epscross,3)==0)
inside = -100;
else if(strncmp(strlwr(uvalues[k].uval.sval),s_startrail,4)==0)
inside = -101;
else if(strncmp(strlwr(uvalues[k].uval.sval),s_period,3)==0)
inside = -102;
else if(strncmp(strlwr(uvalues[k].uval.sval),s_maxiter,5)==0)
inside = -1;
else
inside = atoi(uvalues[k].uval.sval);
if (inside != old_inside) j = 1;
if(strncmp(strlwr(uvalues[++k].uval.sval),s_real,4)==0)
outside = -2;
else if(strncmp(strlwr(uvalues[k].uval.sval),s_imag,4)==0)
outside = -3;
else if(strncmp(strlwr(uvalues[k].uval.sval),s_mult,4)==0)
outside = -4;
else if(strncmp(strlwr(uvalues[k].uval.sval),s_sum,4)==0)
outside = -5;
else if(strncmp(strlwr(uvalues[k].uval.sval),s_iter,4)==0)
outside = -1;
else
outside = atoi(uvalues[k].uval.sval);
if (outside != old_outside) j = 1;
strcpy(savename,uvalues[++k].uval.sval);
if (strcmp(savename,prevsavename))
resave_flag = started_resaves = 0; /* forget pending increment */
overwrite = uvalues[++k].uval.ch.val;
soundflag = uvalues[++k].uval.ch.val - 1;
if (soundflag != old_soundflag && (soundflag > 1 || old_soundflag > 1))
j = 1;
LogFlag = uvalues[++k].uval.ival;
if (LogFlag != old_logflag) j = 1;
usr_biomorph = uvalues[++k].uval.ival;
if (usr_biomorph != old_biomorph) j = 1;
decomp[0] = uvalues[++k].uval.ival;
if (decomp[0] != old_decomp) j = 1;
if(strncmp(strlwr(uvalues[++k].uval.sval),s_normal,4)==0)
fillcolor = -1;
else
fillcolor = atoi(uvalues[k].uval.sval);
if (fillcolor != old_fillcolor) j = 1;
orbit_delay = uvalues[++k].uval.ival;
/*
if(AntiAliasing != uvalues[++k].uval.ival) j = 1;
AntiAliasing = uvalues[k].uval.ival;
if(AntiAliasing < 0) AntiAliasing = 0;
if(AntiAliasing > 8) AntiAliasing = 8;
*/
EXIT_OVLY;
return(j);
}
/*
get_toggles2() is similar to get_toggles, invoked by 'y' key
*/
int get_toggles2()
{
static char far hdg[]={" Extended Options\n\
(not all combinations make sense)"};
char far *choices[20];
int oldhelpmode;
struct fullscreenvalues uvalues[25];
int i, j, k;
int old_rotate_lo,old_rotate_hi;
int old_usr_distest,old_distestwidth;
double old_potparam[3],old_inversion[3];
ENTER_OVLY(OVLY_PROMPTS2);
/* fill up the choices (and previous values) arrays */
k = -1;
LOADCHOICES("Look for finite attractor (0=no,>0=yes,<0=phase)");
uvalues[k].type = 'i';
uvalues[k].uval.ch.val = finattract;
LOADCHOICES("Potential Max Color (0 means off)");
uvalues[k].type = 'i';
uvalues[k].uval.ival = old_potparam[0] = potparam[0];
LOADCHOICES(" Slope");
uvalues[k].type = 'd';
uvalues[k].uval.dval = old_potparam[1] = potparam[1];
LOADCHOICES(" Bailout");
uvalues[k].type = 'i';
uvalues[k].uval.ival = old_potparam[2] = potparam[2];
LOADCHOICES(" 16 bit values");
uvalues[k].type = 'y';
uvalues[k].uval.ch.val = pot16bit;
LOADCHOICES("Distance Estimator (0=off, <0=edge, >0=on):");
uvalues[k].type = 'i';
uvalues[k].uval.ival = old_usr_distest = usr_distest;
LOADCHOICES(" width factor:");
uvalues[k].type = 'i';
uvalues[k].uval.ival = old_distestwidth = distestwidth;
LOADCHOICES("Inversion radius or \"auto\" (0 means off)");
LOADCHOICES(" center X coordinate or \"auto\"");
LOADCHOICES(" center Y coordinate or \"auto\"");
k = k - 3;
for (i= 0; i < 3; i++) {
uvalues[++k].type = 's';
if ((old_inversion[i] = inversion[i]) == AUTOINVERT)
sprintf(uvalues[k].uval.sval,"auto");
else
sprintf(uvalues[k].uval.sval,"%g",inversion[i]);
}
LOADCHOICES(" (use fixed radius & center when zooming)");
uvalues[k].type = '*';
LOADCHOICES("Color cycling from color (0 ... 254)");
uvalues[k].type = 'i';
uvalues[k].uval.ival = old_rotate_lo = rotate_lo;
LOADCHOICES(" to color (1 ... 255)");
uvalues[k].type = 'i';
uvalues[k].uval.ival = old_rotate_hi = rotate_hi;
oldhelpmode = helpmode;
helpmode = HELPYOPTS;
i = fullscreen_prompt(hdg,k+1,choices,uvalues,0,0,NULL);
helpmode = oldhelpmode;
if (i < 0) {
EXIT_OVLY;
return(-1);
}
/* now check out the results (*hopefully* in the same order <grin>) */
k = -1;
j = 0; /* return code */
if (uvalues[++k].uval.ch.val != finattract) {
finattract = uvalues[k].uval.ch.val;
j = 1;
}
potparam[0] = uvalues[++k].uval.ival;
if (potparam[0] != old_potparam[0]) j = 1;
potparam[1] = uvalues[++k].uval.dval;
if (potparam[0] != 0.0 && potparam[1] != old_potparam[1]) j = 1;
potparam[2] = uvalues[++k].uval.ival;
if (potparam[0] != 0.0 && potparam[2] != old_potparam[2]) j = 1;
if (uvalues[++k].uval.ch.val != pot16bit) {
pot16bit = uvalues[k].uval.ch.val;
if (pot16bit) { /* turned it on */
if (potparam[0] != 0.0) j = 1;
}
else /* turned it off */
if (dotmode != 11) /* ditch the disk video */
enddisk();
else /* keep disk video, but ditch the fraction part at end */
disk16bit = 0;
}
++k;
usr_distest = (uvalues[k].uval.ival > 32000) ? 32000 : uvalues[k].uval.ival;
if (usr_distest != old_usr_distest) j = 1;
++k;
distestwidth = uvalues[k].uval.ival;
if (usr_distest && distestwidth != old_distestwidth) j = 1;
for (i = 0; i < 3; i++) {
if (uvalues[++k].uval.sval[0] == 'a' || uvalues[k].uval.sval[0] == 'A')
inversion[i] = AUTOINVERT;
else
inversion[i] = atof(uvalues[k].uval.sval);
if (old_inversion[i] != inversion[i]
&& (i == 0 || inversion[0] != 0.0))
j = 1;
}
invert = (inversion[0] == 0.0) ? 0 : 3;
++k;
rotate_lo = uvalues[++k].uval.ival;
rotate_hi = uvalues[++k].uval.ival;
if (rotate_lo < 0 || rotate_hi > 255 || rotate_lo > rotate_hi) {
rotate_lo = old_rotate_lo;
rotate_hi = old_rotate_hi;
}
EXIT_OVLY;
return(j);
}
/* --------------------------------------------------------------------- */
/*
get_view_params() is called from FRACTINT.C whenever the 'v' key
is pressed. Return codes are:
-1 routine was ESCAPEd - no need to re-generate the image.
0 minor variable changed. No need to re-generate the image.
1 View changed. Re-generate the image.
*/
int get_view_params()
{
static char far hdg[]={"View Window Options"};
char far *choices[8];
int oldhelpmode;
struct fullscreenvalues uvalues[25];
int i, k;
float old_viewreduction,old_aspectratio;
int old_viewwindow,old_viewcrop,old_viewxdots,old_viewydots;
ENTER_OVLY(OVLY_PROMPTS2);
stackscreen();
old_viewwindow = viewwindow;
old_viewcrop = viewcrop;
old_viewreduction = viewreduction;
old_aspectratio = finalaspectratio;
old_viewxdots = viewxdots;
old_viewydots = viewydots;
get_view_restart:
/* fill up the previous values arrays */
k = -1;
LOADCHOICES("Preview display? (no for full screen)");
uvalues[k].type = 'y';
uvalues[k].uval.ch.val = viewwindow;
LOADCHOICES("Auto window size reduction factor");
uvalues[k].type = 'f';
uvalues[k].uval.dval = viewreduction;
LOADCHOICES("Final media overall aspect ratio, y/x");
uvalues[k].type = 'f';
uvalues[k].uval.dval = finalaspectratio;
LOADCHOICES("Crop starting coordinates to new aspect ratio?");
uvalues[k].type = 'y';
uvalues[k].uval.ch.val = viewcrop;
LOADCHOICES("Explicit size x pixels (0 for auto size)");
uvalues[k].type = 'i';
uvalues[k].uval.ival = viewxdots;
LOADCHOICES(" y pixels (0 to base on aspect ratio)");
uvalues[k].type = 'i';
uvalues[k].uval.ival = viewydots;
LOADCHOICES("");
uvalues[k].type = '*';
LOADCHOICES("Press F4 to reset view parameters to defaults.");
uvalues[k].type = '*';
oldhelpmode = helpmode; /* this prevents HELP from activating */
helpmode = HELPVIEW;
i = fullscreen_prompt(hdg,k+1,choices,uvalues,0,16,NULL);
helpmode = oldhelpmode; /* re-enable HELP */
if (i < 0) {
viewwindow = old_viewwindow;
viewcrop = old_viewcrop;
viewreduction = old_viewreduction;
finalaspectratio = old_aspectratio;
viewxdots = old_viewxdots;
viewydots = old_viewydots;
unstackscreen();
EXIT_OVLY;
return(-1);
}
if (i == F4) {
viewwindow = viewxdots = viewydots = 0;
viewreduction = 4.2;
viewcrop = 1;
finalaspectratio = screenaspect;
goto get_view_restart;
}
/* now check out the results (*hopefully* in the same order <grin>) */
k = -1;
viewwindow = uvalues[++k].uval.ch.val;
viewreduction = uvalues[++k].uval.dval;
if ((finalaspectratio = uvalues[++k].uval.dval) == 0)
finalaspectratio = screenaspect;
viewcrop = uvalues[++k].uval.ch.val;
viewxdots = uvalues[++k].uval.ival;
viewydots = uvalues[++k].uval.ival;
if (finalaspectratio != old_aspectratio && viewcrop)
aspectratio_crop(old_aspectratio,finalaspectratio);
i = 0;
if (viewwindow != old_viewwindow
|| (viewwindow
&& ( viewreduction != old_viewreduction
|| finalaspectratio != old_aspectratio
|| viewxdots != old_viewxdots
|| (viewydots != old_viewydots && viewxdots) ) ) )
i = 1;
unstackscreen();
EXIT_OVLY;
return(i);
}
/*
get_cmd_string() is called from FRACTINT.C whenever the 'g' key
is pressed. Return codes are:
-1 routine was ESCAPEd - no need to re-generate the image.
0 parameter changed, no need to regenerate
>0 parameter changed, regenerate
*/
int get_cmd_string()
{
int oldhelpmode;
int i;
char cmdbuf[61];
ENTER_OVLY(OVLY_PROMPTS2);
oldhelpmode = helpmode;
helpmode = HELPCOMMANDS;
cmdbuf[0] = 0;
i = field_prompt(0,"Enter command string to use.",NULL,cmdbuf,60,NULL);
helpmode = oldhelpmode;
if (i >= 0 && cmdbuf[0] != 0)
i = cmdarg(cmdbuf, 2);
EXIT_OVLY;
return(i);
}
/* --------------------------------------------------------------------- */
int Distribution = 30, Offset = 0, Slope = 25;
long con;
static char far sf1[] = {"Star Density in Pixels per Star"};
static char far sf2[] = {"Percent Clumpiness"};
static char far sf3[] = {"Ratio of Dim stars to Bright"};
static char far *starfield_prompts[] = {sf1,sf2,sf3};
static double starfield_values[4] = {
30.0,100.0,5.0,0.0
};
char GreyFile[] = "altern.map";
int starfield(void)
{
int c;
extern char busy;
busy = 1;
if (starfield_values[0] < 1.0) starfield_values[0] = 1.0;
if (starfield_values[0] > 100.0) starfield_values[0] = 100.0;
if (starfield_values[1] < 1.0) starfield_values[1] = 1.0;
if (starfield_values[1] > 100.0) starfield_values[1] = 100.0;
if (starfield_values[2] < 1.0) starfield_values[2] = 1.0;
if (starfield_values[2] > 100.0) starfield_values[2] = 100.0;
Distribution = (int)(starfield_values[0]);
con = (long)(((starfield_values[1]) / 100.0) * (1L << 16));
Slope = (int)(starfield_values[2]);
if (ValidateLuts(GreyFile) != 0) {
static char far msg[]={"Unable to load ALTERN.MAP"};
stopmsg(0,msg);
busy = 0;
return(-1);
}
spindac(0,1); /* load it, but don't spin */
for(row = 0; row < ydots; row++) {
for(col = 0; col < xdots; col++) {
if(keypressed()) {
buzzer(1);
busy = 0;
return(1);
}
c = getcolor(col, row);
if(c == inside)
c = colors-1;
putcolor(col, row, GausianNumber(c, colors));
}
}
buzzer(0);
busy = 0;
return(0);
}
int get_starfield_params(void) {
static char far hdg[]={"Starfield Parameters"};
struct fullscreenvalues uvalues[3];
int oldhelpmode, status;
int i;
ENTER_OVLY(OVLY_PROMPTS2);
if(colors < 255) {
static char far msg[]={"starfield requires 256 color mode"};
stopmsg(0,msg);
EXIT_OVLY;
return(-1);
}
for (i = 0; i < 3; i++) {
uvalues[i].uval.dval = starfield_values[i];
uvalues[i].type = 'f';
}
stackscreen();
oldhelpmode = helpmode;
helpmode = HELPSTARFLD;
i = fullscreen_prompt(hdg,3,starfield_prompts,uvalues,0,0,NULL);
helpmode = oldhelpmode;
if (i < 0) {
unstackscreen();
EXIT_OVLY;
return(-1);
}
unstackscreen();
for (i = 0; i < 3; i++)
starfield_values[i] = uvalues[i].uval.dval;
EXIT_OVLY;
return(0);
}
int get_a_number(double *x, double *y)
{
static char far hdg[]={"Set Cursor Coordinates"};
double x1,y2;
char far *choices[2];
int oldhelpmode;
struct fullscreenvalues uvalues[2];
int i, k;
ENTER_OVLY(OVLY_PROMPTS2);
stackscreen();
/* fill up the previous values arrays */
k = -1;
LOADCHOICES("X coordinate at cursor");
uvalues[k].type = 'd';
uvalues[k].uval.dval = *x;
LOADCHOICES("Y coordinate at cursor");
uvalues[k].type = 'd';
uvalues[k].uval.dval = *y;
i = fullscreen_prompt(hdg,k+1,choices,uvalues,0,25,NULL);
if (i < 0) {
unstackscreen();
EXIT_OVLY;
return(-1);
}
/* now check out the results (*hopefully* in the same order <grin>) */
k = -1;
*x = uvalues[++k].uval.dval;
*y = uvalues[++k].uval.dval;
unstackscreen();
EXIT_OVLY;
return(i);
}
/* --------------------------------------------------------------------- */
int get_commands() /* execute commands from file */
{
int ret;
FILE *parmfile;
long point;
int oldhelpmode;
ENTER_OVLY(OVLY_PROMPTS2);
ret = 0;
oldhelpmode = helpmode;
helpmode = HELPPARMFILE;
if ((point = get_file_entry(GETPARM,"Parameter Set",
commandmask,CommandFile,CommandName)) >= 0
&& (parmfile = fopen(CommandFile,"rb"))) {
fseek(parmfile,point,SEEK_SET);
ret = load_commands(parmfile);
}
helpmode = oldhelpmode;
EXIT_OVLY;
return(ret);
}
/* --------------------------------------------------------------------- */
void goodbye() /* we done. Bail out */
{
static char far goodbyemessage[]={" Thank You for using FRACTINT"};
extern BYTE exitmode;
extern int mode7text;
extern int made_dsktemp;
#ifndef XFRACT
union REGS r;
#endif
#ifdef WINFRACT
return;
#endif
setvideotext();
#ifdef XFRACT
UnixDone();
printf("\n\n\n%s\n",goodbyemessage); /* printf takes far pointer */
#else
r.h.al = (mode7text == 0) ? exitmode : 7;
r.h.ah = 0;
int86(0x10, &r, &r);
printf("\n\n\n%Fs\n",goodbyemessage); /* printf takes far pointer */
#endif
movecursor(6,0);
discardgraphics(); /* if any emm/xmm tied up there, release it */
stopslideshow();
#ifndef XFRACT
if (made_dsktemp)
remove(diskfilename);
#endif
end_help();
if (initbatch == 3) /* exit with error code for batch file */
exit(2);
else if (initbatch == 4)
exit(1);
else
exit(0);
}
/* --------------------------------------------------------------------- */
#ifdef XFRACT
static char searchdir[FILE_MAX_DIR];
static char searchname[FILE_MAX_PATH];
static char searchext[FILE_MAX_EXT];
static DIR *currdir = NULL;
#endif
static int findfirst(char *path) /* Find 1st file (or subdir) meeting path/filespec */
{
#ifndef XFRACT
union REGS regs;
regs.h.ah = 0x1A; /* Set DTA to filedata */
regs.x.dx = (unsigned)&DTA;
intdos(®s, ®s);
regs.h.ah = 0x4E; /* Find 1st file meeting path */
regs.x.dx = (unsigned)path;
regs.x.cx = FILEATTR;
intdos(®s, ®s);
return(regs.x.ax); /* Return error code */
#else
if (currdir != NULL) {
closedir(currdir);
currdir = NULL;
}
splitpath(path,NULL,searchdir,searchname,searchext);
if (searchdir[0]=='\0') {
currdir = opendir(".");
} else {
currdir = opendir(searchdir);
}
if (currdir==NULL) {
return -1;
} else {
return findnext();
}
#endif
}
static int findnext() /* Find next file (or subdir) meeting above path/filespec */
{
#ifndef XFRACT
union REGS regs;
regs.h.ah = 0x4F; /* Find next file meeting path */
regs.x.dx = (unsigned)&DTA;
intdos(®s, ®s);
return(regs.x.ax);
#else
#ifdef DIRENT
struct dirent *dirEntry;
#else
struct direct *dirEntry;
#endif
struct stat sbuf;
char thisname[FILE_MAX_PATH];
char tmpname[FILE_MAX_PATH];
char thisext[FILE_MAX_EXT];
while (1) {
dirEntry = readdir(currdir);
if (dirEntry == NULL) {
closedir(currdir);
currdir = NULL;
return -1;
} else if (dirEntry->d_ino != 0) {
splitpath(dirEntry->d_name,NULL,NULL,thisname,thisext);
if ((searchname[0]=='*' || strcmp(searchname,thisname)==0) &&
(searchext[0]=='*' || strcmp(searchext,thisext)==0)) {
strncpy(DTA.filename,dirEntry->d_name,20);
DTA.filename[20]=='\0';
strcpy(tmpname,searchdir);
strcat(tmpname,"/");
strcat(tmpname,dirEntry->d_name);
stat(tmpname,&sbuf);
if ((sbuf.st_mode&S_IFMT)==S_IFREG) {
DTA.attribute = 0;
} else if ((sbuf.st_mode&S_IFMT)==S_IFDIR) {
DTA.attribute = SUBDIR;
} else {
continue;
}
DTA.size = sbuf.st_size;
return 0;
}
}
}
#endif
}
int lccompare(VOIDCONSTPTR arg1, VOIDCONSTPTR arg2) /* for qsort */
{
return(strncasecmp(*((char **)arg1),*((char **)arg2),40));
}
static char *masks[] = {"*.pot","*.gif"};
static int speedstate;
int getafilename(char *hdg,char *template,char *flname)
{
static char far instr[]={"Press F6 for default or environment directory"};
int masklen;
char filename[13];
char speedstr[81];
char tmpmask[FILE_MAX_PATH]; /* used to locate next file in list */
static int numtemplates = 1;
int i,j;
int out;
int retried;
struct CHOICE
{
char name[13];
char type;
}
*choices[MAXNUMFILES];
int attributes[MAXNUMFILES];
int filecount; /* how many files */
int dircount; /* how many directories */
int notroot; /* not the root directory */
char drive[FILE_MAX_DRIVE];
char dir[FILE_MAX_DIR];
char fname[FILE_MAX_FNAME];
char ext[FILE_MAX_EXT];
ENTER_OVLY(OVLY_PROMPTS2);
/* steal existing array for "choices" */
choices[0] = (struct CHOICE *)boxy;
attributes[0] = 1;
for(i=1;i<MAXNUMFILES;i++)
{
choices[i] = choices[i-1] + 1;
attributes[i] = 1;
}
restart: /* return here if template or directory changes */
tmpmask[0] = 0;
if(flname[0] == 0)
strcpy(flname,DOTSLASH);
splitpath(flname ,drive,dir,fname,ext);
makepath(filename,"" ,"" ,fname,ext);
retried = 0;
retry_dir:
if (dir[0] == 0)
strcpy(dir,".");
expand_dirname(dir,drive);
makepath(tmpmask,drive,dir,"","");
fix_dirname(tmpmask);
if (retried == 0 && strcmp(dir,SLASH) && strcmp(dir,DOTSLASH))
{
tmpmask[(j = strlen(tmpmask) - 1)] = 0; /* strip trailing \ */
if (strchr(tmpmask,'*') || strchr(tmpmask,'?')
|| findfirst(tmpmask) != 0
|| (DTA.attribute & SUBDIR) == 0)
{
strcpy(dir,DOTSLASH);
++retried;
goto retry_dir;
}
tmpmask[j] = SLASHC;
}
if(template[0])
{
numtemplates = 1;
splitpath(template,NULL,NULL,fname,ext);
}
else
numtemplates = sizeof(masks)/sizeof(masks[0]);
filecount = -1;
dircount = 0;
notroot = 0;
j = 0;
masklen = strlen(tmpmask);
strcat(tmpmask,"*.*");
out = findfirst(tmpmask);
while(out == 0 && filecount < MAXNUMFILES)
{
if((DTA.attribute & SUBDIR) && strcmp(DTA.filename,"."))
{
#ifndef XFRACT
strlwr(DTA.filename);
#endif
if(strcmp(DTA.filename,".."))
strcat(DTA.filename,SLASH);
strncpy(choices[++filecount]->name,DTA.filename,13);
choices[filecount]->name[12] = '\0';
choices[filecount]->type = 1;
dircount++;
if(strcmp(DTA.filename,"..")==0)
notroot = 1;
}
out = findnext();
}
tmpmask[masklen] = 0;
if(template[0])
makepath(tmpmask,drive,dir,fname,ext);
do
{
if(numtemplates > 1)
strcpy(&(tmpmask[masklen]),masks[j]);
out = findfirst(tmpmask);
while(out == 0 && filecount < MAXNUMFILES)
{
if(!(DTA.attribute & SUBDIR))
{
strlwr(DTA.filename);
strncpy(choices[++filecount]->name,DTA.filename,13);
choices[filecount]->type = 0;
}
out = findnext();
}
}
while (++j < numtemplates);
if (++filecount == 0)
{
strcpy(choices[filecount]->name,"*nofiles*");
choices[filecount]->type = 0;
++filecount;
}
qsort(choices,filecount,sizeof(char *),lccompare); /* sort type list */
if(notroot == 0 && dir[0] && dir[0] != SLASHC) /* must be in root directory */
{
splitpath(tmpmask,drive,dir,fname,ext);
strcpy(dir,SLASH);
makepath(tmpmask,drive,dir,fname,ext);
}
if(numtemplates > 1)
strcat(tmpmask," *.pot");
strcpy(temp1,hdg);
strcat(temp1,"\nTemplate: ");
strcat(temp1,tmpmask);
strcpy(speedstr,filename);
if (speedstr[0] == 0)
{
for (i=0; i<filecount; i++) /* find first file */
if (choices[i]->type == 0)
break;
if (i >= filecount)
i = 0;
}
i = fullscreen_choice(8,temp1,NULL,instr,filecount,(char **)choices,
attributes,5,99,12,i,NULL,speedstr,filename_speedstr,check_f6_key);
if (i==-F6)
{
static int lastdir=0;
if (lastdir==0)
{
strcpy(dir,fract_dir1);
}
else
{
strcpy(dir,fract_dir2);
}
fix_dirname(dir);
makepath(flname,drive,dir,"","");
lastdir = 1-lastdir;
goto restart;
}
if (i < 0)
{
EXIT_OVLY;
return(-1);
}
if(speedstr[0] == 0 || speedstate == MATCHING)
{
if(choices[i]->type)
{
if(strcmp(choices[i]->name,"..") == 0) /* go up a directory */
{
if(strcmp(dir,DOTSLASH) == 0)
strcpy(dir,DOTDOTSLASH);
else
{
char *s;
if(s = strrchr(dir,SLASHC)) /* trailing slash */
{
*s = 0;
if(s = strrchr(dir,SLASHC))
*(s+1) = 0;
}
}
}
else /* go down a directory */
strcat(dir,choices[i]->name);
fix_dirname(dir);
makepath(flname,drive,dir,"","");
goto restart;
}
splitpath(choices[i]->name,NULL,NULL,fname,ext);
makepath(flname,drive,dir,fname,ext);
}
else
{
if (speedstate == SEARCHPATH
&& strchr(speedstr,'*') == 0 && strchr(speedstr,'?') == 0
&& findfirst(speedstr) == 0
&& (DTA.attribute & SUBDIR)) /* it is a directory */
speedstate = TEMPLATE;
if(speedstate == TEMPLATE)
{
/* extract from tempstr the pathname and template information,
being careful not to overwrite drive and directory if not
newly specified */
char drive1[FILE_MAX_DRIVE];
char dir1[FILE_MAX_DIR];
char fname1[FILE_MAX_FNAME];
char ext1[FILE_MAX_EXT];
splitpath(speedstr,drive1,dir1,fname1,ext1);
if(drive1[0])
strcpy(drive,drive1);
if(dir1[0])
strcpy(dir,dir1);
makepath(flname,drive,dir,fname1,ext1);
if(strchr(fname1,'*') || strchr(fname1,'?') ||
strchr(ext1 ,'*') || strchr(ext1 ,'?'))
makepath(template,"","",fname1,ext1);
else if(isadirectory(flname))
fix_dirname(flname);
goto restart;
}
else /* speedstate == SEARCHPATH */
{
char fullpath[80];
/* if (strchr(speedstr,'.') == NULL)
strcat(speedstr,".gif"); */
findpath(speedstr,fullpath);
if(fullpath[0])
strcpy(flname,fullpath);
else
{ /* failed, make diagnostic useful: */
strcpy(flname,speedstr);
if (strchr(speedstr,SLASHC) == NULL)
{
splitpath(speedstr,NULL,NULL,fname,ext);
makepath(flname,drive,dir,fname,ext);
}
}
}
}
EXIT_OVLY;
return(0);
}
static int check_f6_key(int curkey,int choice)
{
if (curkey == F6)
return 0-F6;
return 0;
}
static int filename_speedstr(int row, int col, int vid,
char *speedstring, int speed_match)
{
extern char speed_prompt[];
char *prompt;
if ( strchr(speedstring,':')
|| strchr(speedstring,'*') || strchr(speedstring,'*')
|| strchr(speedstring,'?')) {
speedstate = TEMPLATE; /* template */
prompt = "File Template";
}
else if (speed_match) {
speedstate = SEARCHPATH; /* does not match list */
prompt = "Search Path for";
}
else {
speedstate = MATCHING;
prompt = speed_prompt;
}
putstring(row,col,vid,prompt);
return(strlen(prompt));
}
static int isadirectory(char *s)
{
if(strchr(s,'*') || strchr(s,'?'))
return(0); /* for my purposes, not a directory */
if(findfirst(s) != 0) /* couldn't find it */
{
/* any better ideas?? */
if(strchr(s,SLASHC)) /* we'll guess it is a directory */
return(1);
else
return(0); /* no slashes - we'll guess it's a file */
}
else if(DTA.attribute & SUBDIR)
return(1); /* we're SURE it's a directory */
else
return(0);
}
#ifndef XFRACT /* This routine moved to unix.c so we can use it in hc.c */
int splitpath(char *template,char *drive,char *dir,char *fname,char *ext)
{
int length;
int len;
int offset;
char *tmp;
if(drive)
drive[0] = 0;
if(dir)
dir[0] = 0;
if(fname)
fname[0] = 0;
if(ext)
ext[0] = 0;
if((length = strlen(template)) == 0)
return(0);
offset = 0;
/* get drive */
if(length >= 2)
if(template[1] == ':')
{
if(drive)
{
drive[0] = template[offset++];
drive[1] = template[offset++];
drive[2] = 0;
}
else
{
offset++;
offset++;
}
}
/* get dir */
if(offset < length)
{
tmp = strrchr(template,SLASHC);
if(tmp)
{
tmp++; /* first character after slash */
len = tmp - &template[offset];
if(len >=0 && len < 80 && dir)
strncpy(dir,&template[offset],len);
if(len < 80 && dir)
dir[len] = 0;
offset += len;
}
}
else
return(0);
/* get fname */
if(offset < length)
{
tmp = strrchr(template,'.');
if(tmp < strrchr(template,SLASHC) || tmp < strrchr(template,':'))
tmp = 0; /* in this case the '.' must be a directory */
if(tmp)
{
tmp++; /* first character past "." */
len = tmp - &template[offset];
if((len > 0) && (offset+len < length) && fname)
{
strncpy(fname,&template[offset],len);
fname[len] = 0;
}
offset += len;
if((offset < length) && ext)
strcpy(ext,&template[offset]);
}
else if((offset < length) && fname)
strcpy(fname,&template[offset]);
}
return(0);
}
#endif
makepath(char *template,char *drive,char *dir,char *fname,char *ext)
{
#ifndef XFRACT
strcpy(template,drive);
strcat(template,dir);
#else
strcpy(template,dir);
#endif
strcat(template,fname);
strcat(template,ext);
return(0);
}
/* fix up directory names */
static void fix_dirname(char *dirname)
{
int length;
/* scrub white space from end for safety */
length = strlen(dirname); /* index of last character */
while (--length >= 0 && isspace(dirname[length])) { }
dirname[++length] = 0;
/* make sure dirname ends with a slash */
if(length == 0 || dirname[length-1] != SLASHC)
strcat(dirname,SLASH);
}
static int expand_dirname(char *dirname,char *drive)
{
fix_dirname(dirname);
if (dirname[0] != SLASHC) {
char buf[81],curdir[81];
#ifndef XFRACT
union REGS regs;
struct SREGS sregs;
curdir[0] = 0;
regs.h.ah = 0x47; /* get current directory */
regs.h.dl = 0;
if (drive[0] && drive[0] != ' ')
regs.h.dl = tolower(drive[0])-'a'+1;
regs.x.si = (unsigned int) &curdir[0];
segread(&sregs);
intdosx(®s, ®s, &sregs);
#else
getwd(curdir);
#endif
strcat(curdir,SLASH);
while (strncmp(dirname,DOTSLASH,2) == 0) {
strcpy(buf,&dirname[2]);
strcpy(dirname,buf);
}
while (strncmp(dirname,DOTDOTSLASH,3) == 0) {
char *s;
curdir[strlen(curdir)-1] = 0; /* strip trailing slash */
if (s = strrchr(curdir,SLASHC))
*s = 0;
strcat(curdir,SLASH);
strcpy(buf,&dirname[3]);
strcpy(dirname,buf);
}
strcpy(buf,dirname);
dirname[0] = 0;
if (curdir[0] != SLASHC)
strcpy(dirname,SLASH);
strcat(dirname,curdir);
strcat(dirname,buf);
}
return(0);
}
#define LOADPROMPTS(X) {\
static char far tmp[] = { X };\
prompts[++nump]= tmp;\
}
int get_corners()
{
struct fullscreenvalues values[15];
char far *prompts[15];
static char far xprompt[]={" X"};
static char far yprompt[]={" Y"};
static char far zprompt[]={" Z"};
int i,nump,prompt_ret;
int cmag,transp3d;
double Xctr,Yctr,Mag;
BYTE ousemag;
double oxxmin,oxxmax,oyymin,oyymax,oxx3rd,oyy3rd;
double ozzmin,ozzmax,ottmin,ottmax;
/* note that hdg[15] is used for non-transparent heading: */
static char far hdg[]={"Transparent 3d Image Coordinates"};
int oldhelpmode;
transp3d = (Transparent3D && fractalspecific[fractype].orbitcalc == Formula);
oldhelpmode = helpmode;
ousemag = usemag;
oxxmin = xxmin; oxxmax = xxmax;
oyymin = yymin; oyymax = yymax;
oxx3rd = xx3rd; oyy3rd = yy3rd;
ozzmin = zzmin; ozzmax = zzmax;
ottmin = ttmin; ottmax = ttmax;
gc_loop:
for (i = 0; i < 15; ++i)
values[i].type = 'd'; /* most values on this screen are type d */
cmag = (!transp3d && usemag && cvtcentermag(&Xctr, &Yctr, &Mag));
nump = -1;
if (cmag) {
LOADPROMPTS("Center X");
values[nump].uval.dval = Xctr;
LOADPROMPTS("Center Y");
values[nump].uval.dval = Yctr;
LOADPROMPTS("Magnification");
values[nump].uval.dval = Mag;
LOADPROMPTS("");
values[nump].type = '*';
LOADPROMPTS("Press F7 to switch to \"corners\" mode");
values[nump].type = '*';
}
else {
LOADPROMPTS("Top-Left Corner");
values[nump].type = '*';
prompts[++nump] = xprompt;
values[nump].uval.dval = xxmin;
prompts[++nump] = yprompt;
values[nump].uval.dval = yymax;
if (transp3d) {
prompts[++nump] = zprompt;
values[nump].uval.dval = zzmin;
}
LOADPROMPTS("Bottom-Right Corner");
values[nump].type = '*';
prompts[++nump] = xprompt;
values[nump].uval.dval = xxmax;
prompts[++nump] = yprompt;
values[nump].uval.dval = yymin;
if (transp3d) {
prompts[++nump] = zprompt;
values[nump].uval.dval = zzmax;
}
if (transp3d) {
LOADPROMPTS("Time Step");
values[nump].type = '*';
LOADPROMPTS(" From");
values[nump].uval.dval = ttmin;
LOADPROMPTS(" To");
values[nump].uval.dval = ttmax;
}
else {
if (xxmin == xx3rd && yymin == yy3rd)
xx3rd = yy3rd = 0;
LOADPROMPTS("Bottom-left (zeros for top-left X, bottom-right Y)");
values[nump].type = '*';
prompts[++nump] = xprompt;
values[nump].uval.dval = xx3rd;
prompts[++nump] = yprompt;
values[nump].uval.dval = yy3rd;
LOADPROMPTS("Press F7 to switch to \"center-mag\" mode");
values[nump].type = '*';
}
}
LOADPROMPTS("Press F4 to reset to type default values");
values[nump].type = '*';
oldhelpmode = helpmode;
helpmode = HELPCOORDS;
prompt_ret = fullscreen_prompt((transp3d) ? hdg : &hdg[15],
nump+1, prompts, values, 0,
(transp3d) ? 0x10 : 0x90, /* function keys */
NULL);
helpmode = oldhelpmode;
if (prompt_ret < 0) {
usemag = ousemag;
xxmin = oxxmin; xxmax = oxxmax;
yymin = oyymin; yymax = oyymax;
xx3rd = oxx3rd; yy3rd = oyy3rd;
zzmin = ozzmin; zzmax = ozzmax;
ttmin = ottmin; ttmax = ottmax;
return -1;
}
if (prompt_ret == F4) { /* reset to type defaults */
xx3rd = xxmin = curfractalspecific->xmin;
xxmax = curfractalspecific->xmax;
yy3rd = yymin = curfractalspecific->ymin;
yymax = curfractalspecific->ymax;
if (viewcrop && finalaspectratio != screenaspect)
aspectratio_crop(screenaspect,finalaspectratio);
goto gc_loop;
}
if (cmag) {
if ( values[0].uval.dval != Xctr
|| values[1].uval.dval != Yctr
|| values[2].uval.dval != Mag) {
double radius,width;
radius = 1.0 / values[2].uval.dval;
width = radius * (1.0 / screenaspect);
yymax = values[1].uval.dval + radius;
yy3rd = yymin = values[1].uval.dval - radius;
xxmax = values[0].uval.dval + width;
xx3rd = xxmin = values[0].uval.dval - width;
}
}
else {
nump = 1;
xxmin = values[nump++].uval.dval;
yymax = values[nump++].uval.dval;
if (transp3d)
zzmin = values[nump++].uval.dval;
nump++;
xxmax = values[nump++].uval.dval;
yymin = values[nump++].uval.dval;
if (transp3d)
zzmax = values[nump++].uval.dval;
nump++;
if (transp3d) {
ttmin = values[nump++].uval.dval;
ttmax = values[nump++].uval.dval;
}
else {
xx3rd = values[nump++].uval.dval;
yy3rd = values[nump++].uval.dval;
if (xx3rd == 0 && yy3rd == 0) {
xx3rd = xxmin;
yy3rd = yymin;
}
}
}
if (prompt_ret == F7) { /* toggle corners/center-mag mode */
if (usemag == 0)
if (cvtcentermag(&Xctr, &Yctr, &Mag) == 0)
{
static char far msg[] =
{"Corners rotated or stretched, can't use center-mag"};
stopmsg(0,msg);
}
else
usemag = 1;
else
usemag = 0;
goto gc_loop;
}
return((xxmin == oxxmin && xxmax == oxxmax
&& yymin == oyymin && yymax == oyymax
&& xx3rd == oxx3rd && yy3rd == oyy3rd
&& zzmin == ozzmin && zzmax == ozzmax
&& ttmin == ottmin && ttmax == ottmax) ? 0 : 1);
}